<?php

class Application_Model_KalenderMapper
{
	protected $_dbTable = null;
	protected $_kalendername;
	protected $_maxanzahl;
    
	//es muss ein tabellenname angegeben werden, damit man auf den richtigen kalender zugreift
	public function setTableName($kalendername){
    	 $this->_kalendername = $kalendername;
    }
    
    public function setMaxanzahl($anzahl = 1){
    	$this->_maxanzahl = $anzahl; //anzahl an parkplätzen
    }
    
    
	public function getDbTable()
    {
       if (!isset($this->_dbTable)) {
            $this->_dbTable = new Zend_Db_Table($this->_kalendername);
        }
        return $this->_dbTable;
    }
    
    
    public function hinzufuegen($datumvon,$datumbis){
    	$table = $this->getDbTable();
    	$tmp = date("Y-m-d",strtotime($datumvon));
    	
    	while(strtotime($tmp) <= strtotime($datumbis) ){
    		
    		$daten = array('datum'		=>	$tmp,
        				'inhalt'		=>	serialize(array()) );
    		
    		$table->insert($daten);
    		$tmp = date("Y-m-d",strtotime("+1 day", strtotime($tmp)) );
    	}
    }
    
    
	public function entfernen($datumvon,$datumbis){
    	$table = $this->getDbTable();
		$tmp = date("Y-m-d",strtotime($datumvon));
		
    	while(strtotime($tmp) <= strtotime($datumbis) ){
    		
    		$where = $table->getAdapter()->quoteInto('datum = ?', $tmp);
 
			$table->delete($where);
			$tmp = date("Y-m-d",strtotime("+1 day", strtotime($tmp)) );
    	}
    }
    
    
    public function eintragen($datumvon,$datumbis,$benutzernr){
    	$table = $this->getDbTable();
    	$tmp = date("Y-m-d",strtotime($datumvon));
    	
    	$inhalt;
    	$maxanzahl = $this->_maxanzahl;
		
    	while(strtotime($tmp) <= strtotime($datumbis) ){
     		$resultSet = $table->fetchAll($table->select()
     						->where('datum = ?',$tmp));
     		$row = $resultSet[0];//es kann nur eine zeile zurückgegeben werden, da jedes datum einzigartig ist
     		$inhalt = unserialize($row->inhalt);
     		
			if (sizeof($inhalt) < $maxanzahl){//wenn anzahl der benutzer unterhalb des maximums ist
	     		$inhalt[] = $benutzernr;//benutzer hinzufügen
	     		$where = $table->getAdapter()->quoteInto('datum = ?', $tmp);
	     		$daten = array('datum'	=> $tmp,
	     						'inhalt'=> serialize($inhalt) );
	     		$table->update($daten,$where);
	     		
	     		$tmp = date("Y-m-d",strtotime("+1 day", strtotime($tmp)) );
			}else {//wenn ein tag voll ist, dann vorgänge davor rückgängig machen
				//also wieder austragen und false zurückgeben
				$tmp = date("Y-m-d",strtotime("-1 day", strtotime($tmp)) );
				$this->austragen($datumvon,$tmp,$benutzernr);
				return false;
			}
    	}
    	//wenn alles geklappt hat dann true
    	return true;
    }
    
    
	public function austragen($datumvon,$datumbis,$benutzernr){
    	$table = $this->getDbTable();
    	$tmp = date("Y-m-d",strtotime($datumvon));
    	$inhalt;
		
    	while(strtotime($tmp) <= strtotime($datumbis) ){
     		$resultSet = $table->fetchAll($table->select()
     						->where('datum = ?',$tmp));
     						
     		//wenn dieser tag überhaupt im kalender ist
     		if (sizeof($resultSet)>0){
	     		$row = $resultSet[0];//es kann nur eine zeile zurückgegeben werden, da jedes datum einzigartig ist
	   			$inhalt = unserialize($row->inhalt);
	     		
	     		//wenn mehrmals enthalten, dann halt nur einen löschen. ist auch richtiger so.
	    		unset($inhalt[array_search($benutzernr, $inhalt)]);//benutzer löschen
	    		//mit unset entstehen lücken im index, das ist unschön, deshalb
	     		$inhalt = array_values($inhalt);//indexe neu hochzählen
	     		
	     		$where = $table->getAdapter()->quoteInto('datum = ?', $tmp);
	     		$daten = array('datum'	=> $tmp,
	     						'inhalt'=> serialize($inhalt) );
	     		$table->update($daten,$where);
     		}
     		
     		$tmp = date("Y-m-d",strtotime("+1 day", strtotime($tmp)) );
    	}
    	
    }
    
    
    public function erstelleKalender($kalendername){
    	$db = Zend_Db_Table::getDefaultAdapter();
    	
    	//nur wenn eine parkplatznummer angegeben wurde, dann erstelle eine neue tabelle
    	if (isset($kalendername)){
    		$sql = "CREATE TABLE IF NOT EXISTS `" .$kalendername. "` (`datum` date NOT NULL, `inhalt` text NOT NULL, PRIMARY KEY (`datum`))";
    	
    		$db->query($sql);
    	}
    }
    
    
	public function entferneKalender($kalendername){
    	$db = Zend_Db_Table::getDefaultAdapter();
    	
    	//nur wenn eine parkplatznummer angegeben wurde, dann erstelle eine neue tabelle
    	if (isset($kalendername)){
    		$sql = "DROP TABLE `" .$kalendername. "`";
    		$db->query($sql);
    	}
    }
    
    
    public function getMinMax(){
    	//gibt null zurück wenn kalender leer ist.
    	$resultSet = $this->getDbTable()->fetchAll();
    	if (sizeof($resultSet)==0){
    		return ;
    	}

     	$entries = array();
     	$datummin = strtotime($resultSet[0]->datum);
     	$datummax = strtotime($resultSet[0]->datum);
     	
     	foreach ($resultSet as $row) {
     		$tmpdatum = strtotime($row->datum);
     		if ($tmpdatum > $datummax)
     			$datummax = $tmpdatum;
     		else if ($tmpdatum < $datummin)
     			$datummin = $tmpdatum;
     	}
     	return array('min' => date("Y-m-d",$datummin), 'max' => date("Y-m-d",$datummax) );
    }
    
}